//// map::empty
//#include <iostream>
//#include <map>
//
//int main()
//{
//    std::map<char, int> mymap;
//
//    mymap['a'] = 10;
//    mymap['b'] = 20;
//    mymap['c'] = 30;
//
//    while (!mymap.empty())
//    {
//        std::cout << mymap.begin()->first << " => " << mymap.begin()->second << '\n';
//        mymap.erase(mymap.begin());
//    }
//
//    return 0;
//}
//
//// map::size
//#include <iostream>
//#include <map>
//
//int main()
//{
//	std::map<char, int> mymap;
//	mymap['a'] = 101;
//	mymap['b'] = 202;
//	mymap['c'] = 302;
//
//	std::cout << "mymap.size() is " << mymap.size() << '\n';
//
//	return 0;
//}
//
//// accessing mapped values
//#include <iostream>
//#include <map>
//#include <string>
//
//int main()
//{
//	std::map<char, std::string> mymap;
//
//	mymap['a'] = "an element";
//	mymap['b'] = "another element";
//	mymap['c'] = mymap['b'];
//
//	std::cout << "mymap['a'] is " << mymap['a'] << '\n';
//	std::cout << "mymap['b'] is " << mymap['b'] << '\n';
//	std::cout << "mymap['c'] is " << mymap['c'] << '\n';
//	std::cout << "mymap['d'] is " << mymap['d'] << '\n';
//
//	std::cout << "mymap now contains " << mymap.size() << " elements.\n";
//
//	return 0;
//}
//
//// map::insert (C++98)
//#include <iostream>
//#include <map>
//
//int main()
//{
//    std::map<char, int> mymap;
//
//    // first insert function version (single parameter):
//    mymap.insert(std::pair<char, int>('a', 100));
//    mymap.insert(std::pair<char, int>('z', 200));
//
//    std::pair<std::map<char, int>::iterator, bool> ret;
//    ret = mymap.insert(std::pair<char, int>('z', 500));
//    if (ret.second == false) {
//        std::cout << "element 'z' already existed";
//        std::cout << " with a value of " << ret.first->second << '\n';
//    }
//
//    // second insert function version (with hint position):
//    std::map<char, int>::iterator it = mymap.begin();
//    mymap.insert(it, std::pair<char, int>('b', 300));  // max efficiency inserting
//    mymap.insert(it, std::pair<char, int>('c', 400));  // no max efficiency inserting
//
//    // third insert function version (range insertion):
//    std::map<char, int> anothermap;
//    anothermap.insert(mymap.begin(), mymap.find('c'));
//
//    // showing contents:
//    std::cout << "mymap contains:\n";
//    for (it = mymap.begin(); it != mymap.end(); ++it)
//        std::cout << it->first << " => " << it->second << '\n';
//
//    std::cout << "anothermap contains:\n";
//    for (it = anothermap.begin(); it != anothermap.end(); ++it)
//        std::cout << it->first << " => " << it->second << '\n';
//
//    return 0;
//}
//
//// erasing from map
//#include <iostream>
//#include <map>
//
//int main()
//{
//    std::map<char, int> mymap;
//    std::map<char, int>::iterator it;
//
//    // insert some values:
//    mymap['a'] = 10;
//    mymap['b'] = 20;
//    mymap['c'] = 30;
//    mymap['d'] = 40;
//    mymap['e'] = 50;
//    mymap['f'] = 60;
//
//    it = mymap.find('b');
//    mymap.erase(it);                   // erasing by iterator
//
//    mymap.erase('c');                  // erasing by key
//
//    it = mymap.find('e');
//    mymap.erase(it, mymap.end());    // erasing by range
//
//    // show content:
//    for (it = mymap.begin(); it != mymap.end(); ++it)
//        std::cout << it->first << " => " << it->second << '\n';
//
//    return 0;
//}
//
//// map::clear
//#include <iostream>
//#include <map>
//
//int main()
//{
//    std::map<char, int> mymap;
//
//    mymap['x'] = 100;
//    mymap['y'] = 200;
//    mymap['z'] = 300;
//
//    std::cout << "mymap contains:\n";
//    for (std::map<char, int>::iterator it = mymap.begin(); it != mymap.end(); ++it)
//        std::cout << it->first << " => " << it->second << '\n';
//
//    mymap.clear();
//    mymap['a'] = 1101;
//    mymap['b'] = 2202;
//
//    std::cout << "mymap contains:\n";
//    for (std::map<char, int>::iterator it = mymap.begin(); it != mymap.end(); ++it)
//        std::cout << it->first << " => " << it->second << '\n';
//
//    return 0;
////}
//
//// map::find
//#include <iostream>
//#include <map>
//
//int main()
//{
//    std::map<char, int> mymap;
//    std::map<char, int>::iterator it;
//
//    mymap['a'] = 50;
//    mymap['b'] = 100;
//    mymap['c'] = 150;
//    mymap['d'] = 200;
//
//    it = mymap.find('b');
//    if (it != mymap.end())
//        mymap.erase(it);
//
//    // print content:
//    std::cout << "elements in mymap:" << '\n';
//    std::cout << "a => " << mymap.find('a')->second << '\n';
//    std::cout << "c => " << mymap.find('c')->second << '\n';
//    std::cout << "d => " << mymap.find('d')->second << '\n';
//
//    return 0;
//}
//
//// map::count
//#include <iostream>
//#include <map>
//
//int main()
//{
//    std::map<char, int> mymap;
//    char c;
//
//    mymap['a'] = 101;
//    mymap['c'] = 202;
//    mymap['f'] = 303;
//
//    for (c = 'a'; c < 'h'; c++)
//    {
//        std::cout << c;
//        if (mymap.count(c) > 0)
//            std::cout << " is an element of mymap.\n";
//        else
//            std::cout << " is not an element of mymap.\n";
//    }
//
//    return 0;
//}

// map::lower_bound/upper_bound
#include <iostream>
#include <map>

int main()
{
    std::map<char, int> mymap;
    std::map<char, int>::iterator itlow, itup;

    mymap['a'] = 20;
    mymap['b'] = 40;
    mymap['c'] = 60;
    mymap['d'] = 80;
    mymap['e'] = 100;

    itlow = mymap.lower_bound('b');  // itlow points to b
    itup = mymap.upper_bound('d');   // itup points to e (not d!)

    mymap.erase(itlow, itup);        // erases [itlow,itup)

    // print content:
    for (std::map<char, int>::iterator it = mymap.begin(); it != mymap.end(); ++it)
        std::cout << it->first << " => " << it->second << '\n';

    return 0;
}